#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;

//int main()
//{
//    int n;
//    while (cin >> n)
//    {
//        vector<int> v(n);
//        for (int i = 0; i < n; ++i)
//        {
//            v[i] = i + 1;
//        }
//
//        int left = -1;
//        int right = n;
//
//        while (right - left > 5)
//        {
//            cout << v[left + 1] << " ";
//            cout << v[left + 3] << " ";
//            cout << v[left + 2] << " ";
//
//            cout << v[right - 1] << " ";
//
//            left += 3;
//            --right;
//        }
//        if (right - left == 5)
//        {
//            cout << v[left + 1] << " ";
//            cout << v[left + 3] << " ";
//            cout << v[left + 2] << " ";
//            cout << v[right - 1] << endl;
//        }
//        else if (right - left == 4)
//        {
//            cout << v[left + 1] << " ";
//            cout << v[left + 3] << " ";
//            cout << v[left + 2] << endl;
//        }
//        else if (right - left == 3)
//        {
//            cout << v[left + 1] << " ";
//            cout << v[right - 1] << endl;
//        }
//        else
//        {
//            cout << v[left + 1] << endl;
//        }
//    }
//    return 0;
//}


//int main() {
//    int n, m;
//    while (cin >> n >> m)
//    {
//        int len = n + m;
//        vector<int> v(len);
//        for (int i = 0; i < len; ++i)
//        {
//            cin >> v[i];
//        }
//
//        sort(v.begin(), v.end());
//
//        int cur = 1;
//        int dest = 0;
//        cout << v[0] << " ";
//        for (; cur < len; ++cur)
//        {
//            if (v[cur] != v[dest])
//            {
//                v[++dest] = v[cur];
//                cout << v[dest] << " ";
//            }
//        }
//        cout << endl;
//    }
//    return 0;
//}



class Solution {
public:
    int longestPalindromeSubseq(string s)
    {
        int n = s.size();
        vector<vector<int>> vv(n, vector<int>(n));
        unordered_multimap<char, int> hash;
        hash.rehash(n);
        for (int i = 0; i < n; ++i)
        {
            hash.insert({ s[i], i });
        }

        int ret = 0;
        for (int i = 0; i < n; ++i)
        {

            if (i == 3)
            {
                cout << endl;
            }
            for (int j = i; j < n; ++j)
            {
                /*if (i == 2 && j == 6)
                {
                    cout << endl;
                }*/
                if (s[i] == s[j])
                {
                    ++vv[i][j];
                    if (i != j)  ++vv[i][j];

                    int left = i;
                    int right = j;
                    int flag1 = 0;
                    while (left > 0 && right < n - 1)
                    {
                        unordered_multimap<char, int>::iterator it = hash.find(s[right + 1]);
                        unordered_multimap<char, int>::iterator dest = hash.end();
                        int tmp = -1;

                        while (it != hash.end() && it->first == s[right + 1] && it->second < left)
                        {
                            
                            if (it->second > tmp)
                            {
                                tmp = it->second;
                                dest = it;
                            }
                            ++it;
                        }
                        if (dest != hash.end())
                        {
                            flag1 += 2;
                            left = dest->second;
                        }
                        ++right;
                    }

                    left = i;
                    right = j;
                    int flag2 = 0;
                    while (left > 0 && right < n - 1)
                    {
                        unordered_multimap<char, int>::iterator it = hash.find(s[left - 1]);
                        unordered_multimap<char, int>::iterator dest = hash.end();
                        int tmp = n;

                        while (it != hash.end() && it->first == s[left - 1])
                        {

                            if (it->second > right &&  it->second < tmp)
                            {
                                tmp = it->second;
                                dest = it;
                            }
                            ++it;
                        }
                        if (dest != hash.end())
                        {
                            flag2 += 2;
                            right = dest->second;
                        }
                        --left;
                    }

                    vv[i][j] += max(flag1, flag2);

                    ret = max(vv[i][j], ret);
                }
            }
        }
        return ret;
    }
};
int main()
{
    string s = "baaaaabbab";
    cout << Solution().longestPalindromeSubseq(s) << endl;
    return 0;
}